package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.entity.PageParam;
import com.itheima.reggie.mapper.EmployeeMapper;
import com.itheima.reggie.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import java.time.LocalDateTime;

@Transactional
@Service
public class EmployeeServiceImpl  implements EmployeeService {
    
    //注入mapper对象
    @Autowired
    private EmployeeMapper mapper;
    
    /**
     * 更新员工 （包括更新员工的状态和员工的信息）
     *
     * @param employee
     * @return
     */
    @Override
    public int update(Employee employee , long employeeId) {
        
        //补充数据
        //employee.setUpdateTime(LocalDateTime.now());
        //employee.setUpdateUser(employeeId);
        
        
        return mapper.updateById(employee);
    }
    
    /**
     * 分页查询
     *
     * @param pageParam
     * @return
     */
    @Override
    public IPage<Employee> findPage(PageParam pageParam) {
        
        //1. 设置查询第几页，每页查询多少条  select * from employee limit 0  , 10 ;
        IPage<Employee> p = new Page<>(pageParam.getPage(), pageParam.getPageSize());
        
        //2. 添加查询条件
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.like(pageParam.getName() != null , Employee::getName , pageParam.getName());
    
        //接收这个查询回来的数据
        IPage<Employee> page = mapper.selectPage(p, lqw);
    
        System.out.println(p);
        return page;
    }
    
    /**
     * 添加员工
     *
     * @param employee
     * @return 影响的行数
     */
    @Override
    public int add(Employee employee , long employeeId) {
        
        //1. 补充数据
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        
        //2. 补充创建时间和更新时间
        //employee.setCreateTime(LocalDateTime.now());
        //employee.setUpdateTime(LocalDateTime.now());
    
    
        //3. 补充创建用户和更新用户
        //employee.setCreateUser(employeeId);
        //setUpdateUser(employeeId);
        
        //执行添加
        return mapper.insert(employee);
    }
    
    /**
     * 员工登录
     * 1. 登录其实就是拿着账号和密码去查询数据库，看看有没有这个人存在
     * 2. 但是仅仅返回一个有或者是没有，是不够的，因为员工登录完毕之后，后续的一切操作都无法跟踪了。
     * 3. 所以既然登录是查询操作，那不如把这个人的所有详细信息给查询出来。
     * 4. 后续把这个员工的信息给保存到session作用域里面，这样就能跟踪这个员工的操作了。
     *
     * @param employee
     * @return
     */
    @Override
    public Employee login(Employee employee) {
        
        //1. 构建查询条件对象
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        //1.1 设置按照用户名和密码来查询
        lqw.eq(Employee::getUsername , employee.getUsername());
        
        //对密码进行加密
        String md5Password = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
        lqw.eq(Employee::getPassword , md5Password);
        
        //追加状态的判定
        lqw.eq(Employee::getStatus , 1);
        
        //2. 执行查询操作 因为按照用户名和密码来查询，只会查询到一个用户，所以这里使用selectOne方法
        return mapper.selectOne(lqw);
    }
}
